#!/bin/bash
# rnd.sh:           产生一个10进制的随机数

head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'
# ================================================================================

# 分析 
# ----

# head:
# -c4               选项将获取前4个字节
# od:               将文件以十进制或其他格式输出
# -N4               选项将限制输入为4个字节。
# -tu4              选项将使用元符号10进制格式来输出。
# sed:
# -n                选项，使用"s"命令与"p"标签组合的方式。
#                   将会只输出匹配的行。

# 本脚本作者解释"sed"命令如下：
# head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'
# 假设一直处理到'sed'命令时的输出 -->
# 为000000 1198195154\n 
# sed 命令开始读取字串:000000 1198195154
# 这里它发现一个换行符，
# 所以sed准备处理第一行(000000 1198195154)
# sed 命令开始匹配它的<range>和<action>,第一个匹配的并且只有这一个匹配的 ：

# range           action
# 1               s/.* //P
# 因为行号在range中，所有sed开始执行action:
# 替换掉以空格结束的最长的字符串，在这行中这个字符串是
# ("0000000 "),用空字符串(//)把这个匹配的字串替换掉，如果成功，那就打印出结果。
# ("P"在这里是"s"命令的标志，这与单独的"p"命令是不同的。)
# sed命令现在开始继续读取输入，(注意在继续之前，
# continuing,如果没使用-n选项，sed命令将再次
# 将这行打印一遍.)

# 现在,sed命令读取剩余的字符串，并且找到文件的结尾，
# sed命令开始处理第2行(这行也被标记为'$'
# 因为这已经是最后一行).
# 所以这行没被匹配到<range>中，这样sed命令就结束了。

# 这个sed命令的简短的解释是：
# "在第一行中删除第一个空格左边全部的字符，
# 然后打印出来。"
# 一个更好 的来达到这个目的的方法是：
#       sed -e '/s/.* //;q'
# 这里，<range>和<action>分别是
#                        (也可以写成 sed -e 's/.* / -e q');
# range                         action
# nothing (matches line)        s/.* //
# nothing (matches line)        q(quit)

# 这里，sed命令只会读取第一行的输入，
# 将会执行2个命令，并且会在退出之前打印出（已经替换过的)这行）(因为"q" action).
# 因为没使用'-n'选项

# ================================================================================

# 也可以使用如下一个筻简单的语句来代替。
# head -c4 /dev/urandom|cd -An -tu4

exit 0

# TODO 还没完全看懂 

